package it.controllocredito.backend.phone.calllog;

/*
 * LEGENDA:
 * >> Inizio blocco 
 * << Fine   blocco
 * Esempi di commenti utilizzati:
 
// ________________________________________________________________________________________________________________>>
 
// ******************************************************************************************************************
// *** 											        COSTANTS: 											      ***
// ***									      Propieta' statiche della classe 									  ***
// ******************************************************************************************************************


private static final String ESEMPIO   =  "Questo e un esempio";
// _______________________________________________________________________________________________________________<< 
 
  
  
  
// ________________________________________________________________________________________________________________>>
 
// ******************************************************************************************************************
// *** 											        METODI: 											      ***
// ***									      Metodi di utilita della classe  									  ***
// ******************************************************************************************************************

/**
 * Metodo che restituisce il cursore
 * @param  parameters: Array di stringhe con i valori che vogliamo recuperare dal db 
 * @return Cursore con i suoi dati recuperati della query
 */

// public Cursor managedCursor(String[] parameters)
// {
//		Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,parameters, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
	
//		return cursor;
	
// }

// _______________________________________________________________________________________________________________<< 

import it.controllocredito.backend.utility.Utility;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;

import android.content.ContentResolver;
import android.content.Context;

/***
 * @author Antonio Sulla
 * @category classe di utilita 
 
 * Classe che si occupa di gestire la classe CallLogHandler (che si occupa del registro chiamate), 
 * contiene metodi usato da fuori (servizi,applicazioni,etc.) per il recupero delle informazioni relative le chiamate e non solo
 */
public class ManagerCallLogHandler 
{
	// ******************************************************************************************************************
	// *** 											        PROPIETA': 											      ***
	// ***									      Proprieta' private della classe 									  ***
	// ******************************************************************************************************************
	
	private static final String log_class_name = "ManagerCallLogHandler";
	
	private LinkedHashMap<String, BeanChiamateNumero>  mappaNumeroChiamate;
	
	private ContentResolver contentResolver;
	
	// ******************************************************************************************************************
	// *** 											        COSTRUTTORI: 										      ***
	// ***									      Costruttore default e parametrizzati della classe 				  ***
	// ******************************************************************************************************************
	
	public ManagerCallLogHandler()
	{
		aggiornaRegistroChiamate();
	}

	
	
	public ManagerCallLogHandler(boolean[] filtroTipoChiamata)
	{
		aggiornaRegistroChiamate(filtroTipoChiamata);
	}

	
	public ManagerCallLogHandler(Context context)
	{
		this.contentResolver = context.getContentResolver();
		
		aggiornaRegistroChiamate();
	}
	
	public ManagerCallLogHandler(Context context, boolean[] filtroTipoChiamata)
	{
		this.contentResolver = context.getContentResolver();
		
		aggiornaRegistroChiamate(filtroTipoChiamata);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate();
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver, boolean[] filtroTipoChiamata)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(filtroTipoChiamata);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver,String whereSql)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(whereSql);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver,boolean[] filtroTipoChiamata, String whereSql)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(filtroTipoChiamata, whereSql);
	}
		
	public ManagerCallLogHandler(ContentResolver contentResolver,String[] parametriEstrazioneQuery)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(parametriEstrazioneQuery);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver,boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(filtroTipoChiamata, parametriEstrazioneQuery);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver, String[] parametriEstrazioneQuery, String whereSql)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(parametriEstrazioneQuery, whereSql);
	}
	
	public ManagerCallLogHandler(ContentResolver contentResolver, boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery, String whereSql)
	{
		this.contentResolver = contentResolver;
		
		aggiornaRegistroChiamate(filtroTipoChiamata, parametriEstrazioneQuery, whereSql);
	}
	
	// ******************************************************************************************************************
	// *** 										      	      METODI:  								  			      ***
	// ***									        Metodi public di utilita' per la classe 						  ***
	// ***								        Recupera dati dal registro, aggiornamento					    	  ***
	// ******************************************************************************************************************
		
	public void aggiornaRegistroChiamate()	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver);
		
		init(callLogHandler);
	}
	
	public void aggiornaRegistroChiamate(boolean[] filtroTipoChiamata)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver, filtroTipoChiamata);
		
		init(callLogHandler);
	}
	
	public void aggiornaRegistroChiamate(String whereSql)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver, whereSql);
		
		init(callLogHandler);
	}
		
	
	public void aggiornaRegistroChiamate(boolean[] filtroTipoChiamata, String whereSql)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver,filtroTipoChiamata, whereSql);
		
		init(callLogHandler);
	}
		
	public void aggiornaRegistroChiamate(String[] parametriEstrazioneQuery)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver,parametriEstrazioneQuery);
		
		init(callLogHandler);
	}
	
	public void aggiornaRegistroChiamate(boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver,filtroTipoChiamata, parametriEstrazioneQuery);
		
		init(callLogHandler);
	}
	
	public void aggiornaRegistroChiamate(String[] parametriEstrazioneQuery, String whereSql)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver,parametriEstrazioneQuery, whereSql);
		
		init(callLogHandler);
	}
	
	
	public void aggiornaRegistroChiamate(boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery, String whereSql)	
	{
		CallLogHandler callLogHandler = new CallLogHandler(contentResolver,filtroTipoChiamata, parametriEstrazioneQuery, whereSql);
		
		init(callLogHandler);
	}
		
	// ******************************************************************************************************************
	// *** 											        METODI:  											      ***
	// ***									      Metodi private di utilita' per la classe 							  ***
	// ******************************************************************************************************************
	
	/**
	 * Inizializza callLogHandler, esegue la query sul registor chiaamte
	 * @param callLogHandler: gestisce il registro chiamate
	 */
	private void init(CallLogHandler callLogHandler)
	{
		mappaNumeroChiamate = callLogHandler.eseguiSelectRegistroChiamate();
	}
		
	// ******************************************************************************************************************
	// *** 											        METODI:  											      ***
	// ***									    Metodi public per recuperare dati da fuori		     				  ***
	// ******************************************************************************************************************
		
	/**
	 *  Metodo che restituisce tutte le chiamate effettuate verso questo numero
	 * @param numeroTelefono Criterio di selezione numero telefono.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate a questo numero.
	 */
	public BeanChiamateNumero getChiamata(String numeroTelefono)
	{
		return mappaNumeroChiamate.get(numeroTelefono);
		
	}
		
	/**
	 *  Metodo che restituisce tutte le chiamate effettuate verso questo numero
	 * @param numeroTelefono Criterio di selezione numero telefono.
	 * @param ultimeChiamate Ultime tot telefonate verso questo numero.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate a questo numero.
	 */
	public BeanChiamateNumero getChiamata(String numeroTelefono, int ultimeChiamate)
	{
		return iteratorChiamateNumeroTelefono(numeroTelefono,ultimeChiamate,null);
		
	}
	
	/**
	 *  Metodo che restituisce tutte le chiamate effettuate verso questo numero
	 * @param numeroTelefono Criterio di selezione numero telefono.
	 * @param dataFiltro Ultime telefonate a partire da quella data.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate a questo numero.
	 */
	public BeanChiamateNumero getChiamata(String numeroTelefono, Date dataFiltro)
	{
		return iteratorChiamateNumeroTelefono(numeroTelefono,-1 ,dataFiltro);
		
	}
	
	/**
	 *  Metodo che restituisce tutte le chiamate effettuate verso questo numero
	 * @param numeroTelefono Criterio di selezione numero telefono.
	 * @param ultimeChiamate Ultime tot telefonate verso questo numero.
	 * @param dataFiltro Ultime telefonate a partire da quella data.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate a questo numero.
	 */
	public BeanChiamateNumero getChiamata(String numeroTelefono, int ultimeChiamate, Date dataFiltro)
	{
		return iteratorChiamateNumeroTelefono(numeroTelefono, ultimeChiamate, dataFiltro);
		
	}
	
	// -------------------------------------------------------------------------------------------------------
	
	/**
	 *  Metodo che restituisce tutte le chiamate
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	public BeanChiamateNumero getChiamata()
	{
		return iteratorChiamateLibero(-1,null);
	}
	
	
	/**
	 *  Metodo che restituisce tutte le chiamate
	 * @param ultimeChiamate Ultime tot telefonate.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	public BeanChiamateNumero getChiamata(Date dataFiltro)
	{
		return iteratorChiamateLibero(-1,dataFiltro);
	}
	
	
	/**
	 *  Metodo che restituisce tutte le chiamate
	 * @param ultimeChiamate Ultime tot telefonate.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	public BeanChiamateNumero getChiamata(int ultimeChiamate)
	{
		return iteratorChiamateLibero(ultimeChiamate,null);
	}
	
	/**
	 *  Metodo che restituisce tutte le chiamate
	 * @param ultimeChiamate Ultime tot telefonate verso questo numero.
	 * @param dataFiltro Ultime telefonate a partire da quella data.
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	public BeanChiamateNumero getChiamata(int ultimeChiamate, Date dataFiltro)
	{
		return iteratorChiamateLibero(ultimeChiamate,dataFiltro);
	}
		
	// ________________________________________________________________________________________________________________<<
	
	
	
	
	
	
	// ________________________________________________________________________________________________________________>>
	
	// ******************************************************************************************************************
	// *** 											        METODI:  											      ***
	// ***									      Metodi private di utilita' per la classe 							  ***
	// ******************************************************************************************************************
	

	/**
	 * Metodo per scorrere la lista ed estrazione dati, solo pero per un dato numero di telefono.
	 * @param ultimeChiamate Filtro numerico, ultime chiamate. Puo' essere messo a -1 se non usato il filtro, altrimenti valorizzare
	 * @param dataFiltro  Filtro data. Puo' essere messo a null se non usato il filtro, altrimenti valorizzare
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	private BeanChiamateNumero iteratorChiamateNumeroTelefono(String numeroTelefono, int ultimeChiamate, Date dataFiltro)
	{
		
		ArrayList<BeanChiamata> listaChiamatateFiltrate = new ArrayList<BeanChiamata>();
		BeanChiamateNumero beanChiamateNumeroFiltrate = new BeanChiamateNumero();
		
				
		BeanChiamateNumero beanChiamateNumero = mappaNumeroChiamate.get(numeroTelefono);
		
		if (beanChiamateNumero != null)
		{
			ArrayList<BeanChiamata> listaChiamatate = beanChiamateNumero.getListaChiamate();
			
			int contatore = 0;
			
			for(BeanChiamata beanChiamata : listaChiamatate) 
			{			 
				 if (dataFiltro != null)
				 {
					 // Data chiamata maggiore (dopo) della data richiesta --> Restituisci la chiamata
					 if (beanChiamata.getDataChiamata() > dataFiltro.getTime())
					 {					 
						 beanChiamateNumeroFiltrate = Utility.appendChiamate(listaChiamatateFiltrate,beanChiamata,beanChiamateNumeroFiltrate);
						 contatore++;
					 }
				 }
				 else
				 {
					 beanChiamateNumeroFiltrate = Utility.appendChiamate(listaChiamatateFiltrate,beanChiamata,beanChiamateNumeroFiltrate);
					 contatore++;
				 }
					 
				if (ultimeChiamate > 0)
				{
					if (contatore <= ultimeChiamate)
						return beanChiamateNumeroFiltrate;	
				}
			 }
			 	
		}
			 
		 return beanChiamateNumeroFiltrate;
	}
	
	/**
	 * Metodo per scorrere la mappa ed estrazione dati.
	 * @param ultimeChiamate Filtro numerico, ultime chiamate. Puo' essere messo a -1 se non usato il filtro, altrimenti valorizzare
	 * @param dataFiltro  Filtro data. Puo' essere messo a null se non usato il filtro, altrimenti valorizzare
	 * @return BeanChiamateNumero Contiene informazioni chiamate e lista chiamate.
	 */
	private BeanChiamateNumero iteratorChiamateLibero(int ultimeChiamate, Date dataFiltro)
	{
		ArrayList<BeanChiamata> listaChiamatateFiltrate = new ArrayList<BeanChiamata>();
		BeanChiamateNumero beanChiamateNumeroFiltrate = new BeanChiamateNumero();
		
		Collection<BeanChiamateNumero> collection = mappaNumeroChiamate.values();
		
		if (collection != null)
		{
			Iterator<BeanChiamateNumero> iterator = collection.iterator();
			
			if (iterator != null)
			{
				BeanChiamateNumero beanChiamateNumero = new BeanChiamateNumero();
				
				int contatore = 0;
				
				while (iterator.hasNext())
				{
					
					beanChiamateNumero = iterator.next();
					
					ArrayList<BeanChiamata> listaChiamate = beanChiamateNumero.getListaChiamate();
					
					 for(BeanChiamata beanChiamata : listaChiamate) 
					 {			
						 if (dataFiltro != null)
						 {
							 // Data chiamata maggiore (dopo) della data richiesta --> Restituisci la chiamata
							 if (beanChiamata.getDataChiamata() > dataFiltro.getTime())
							 {
								 beanChiamateNumeroFiltrate = Utility.appendChiamate(listaChiamatateFiltrate,beanChiamata,beanChiamateNumeroFiltrate);
								 contatore++;
							 }
						 } else
						 {
							 beanChiamateNumeroFiltrate = Utility.appendChiamate(listaChiamatateFiltrate,beanChiamata,beanChiamateNumeroFiltrate);
							 contatore++;
						 }
						 
						if (ultimeChiamate > 0)
						{
							if (contatore <= ultimeChiamate)
								return beanChiamateNumeroFiltrate;	
						}
						
					 }
				}
			}
		}
		
		 
		 return beanChiamateNumeroFiltrate;
	}
	
	// ________________________________________________________________________________________________________________<<


}
